# 多项合并到PO文件
import tkinter as tk
from tkinter import filedialog, scrolledtext, messagebox
import polib

class RecipeDisplayApp:
    def __init__(self, root):
        self.root = root
        self.root.title("多行项合并到PO文件")
        self.root.geometry("800x600")

        # 创建界面元素
        self.create_widgets()

    def create_widgets(self):
        # 创建顶部按钮框架
        button_frame = tk.Frame(self.root)
        button_frame.pack(pady=10, fill=tk.X)

        # 合并到PO文件按钮
        self.merge_btn = tk.Button(button_frame, text="合并到PO文件", command=self.merge_to_po)
        self.merge_btn.pack(side=tk.LEFT, padx=10)

        # 新增：创建PO文件按钮
        self.create_po_btn = tk.Button(button_frame, text="创建PO文件", command=self.create_po_file)
        self.create_po_btn.pack(side=tk.LEFT, padx=10)

        # 创建说明标签
        self.instruction_label = tk.Label(self.root, text="请在下方输入框中输入要合并的内容（一行一项）")
        self.instruction_label.pack(pady=5)

        # 创建文本输入区域
        self.text_area = scrolledtext.ScrolledText(self.root, width=80, height=30)
        self.text_area.pack(pady=10, padx=10)

    def merge_to_po(self):
        """将输入框中的内容合并到指定的PO文件中"""
        # 获取输入框中的内容
        text_content = self.text_area.get(1.0, tk.END).strip()

        if not text_content:
            messagebox.showwarning("警告", "没有可合并的内容！")
            return

        # 将输入内容按行分割
        values = [line.strip() for line in text_content.split('\n') if line.strip()]

        if not values:
            messagebox.showwarning("警告", "没有可合并的内容！")
            return

        # 选择PO文件
        po_file_path = filedialog.askopenfilename(
            title="选择要合并到的PO文件",
            filetypes=[("PO文件", "*.po"), ("所有文件", "*.*")]
        )

        if not po_file_path:
            return

        try:
            # 加载PO文件
            po = polib.pofile(po_file_path)

            # 统计信息
            added_count = 0
            skipped_count = 0

            # 获取现有的msgid列表
            existing_msgids = [entry.msgid for entry in po]

            # 添加新条目
            for value in values:
                # 跳过空值
                if not value or not value.strip():
                    continue

                # 如果msgid已存在，跳过
                if value in existing_msgids:
                    skipped_count += 1
                    continue

                # 添加新条目
                entry = polib.POEntry(
                    msgid=value,
                    msgstr=''  # 初始翻译为空
                )
                po.append(entry)
                added_count += 1

            # 保存PO文件
            po.save(po_file_path)

            # 显示结果
            messagebox.showinfo(
                "合并完成",
                f"合并完成！\n添加了 {added_count} 个新条目\n跳过了 {skipped_count} 个已存在的条目"
            )

        except Exception as e:
            messagebox.showerror("错误", f"合并过程中发生错误：\n{str(e)}")

    def create_po_file(self):
        """弹窗选择语言和参数，创建PO文件"""
        def save_po():
            lang = lang_entry.get().strip()
            project = project_entry.get().strip()
            author = author_entry.get().strip()
            if not lang or not project or not author:
                messagebox.showwarning("警告", "请填写所有参数！")
                return

            # 选择保存路径
            file_path = filedialog.asksaveasfilename(
                title="保存PO文件",
                defaultextension=".po",
                filetypes=[("PO文件", "*.po"), ("所有文件", "*.*")]
            )
            if not file_path:
                return

            # 创建PO文件
            po = polib.POFile()
            po.metadata = {
                'Project-Id-Version': project,
                'Report-Msgid-Bugs-To': '',
                'POT-Creation-Date': '',
                'PO-Revision-Date': '',
                'Last-Translator': author,
                'Language-Team': '',
                'Language': lang,
                'MIME-Version': '1.0',
                'Content-Type': 'text/plain; charset=utf-8',
                'Content-Transfer-Encoding': '8bit',
            }
            try:
                po.save(file_path)
                messagebox.showinfo("成功", f"PO文件已创建：\n{file_path}")
                win.destroy()
            except Exception as e:
                messagebox.showerror("错误", f"保存PO文件失败：\n{str(e)}")

        # 弹窗
        win = tk.Toplevel(self.root)
        win.title("创建PO文件")
        win.geometry("350x250")

        tk.Label(win, text="语言代码（如 zh, en, ru:").pack(pady=5)
        lang_entry = tk.Entry(win)
        lang_entry.pack(fill=tk.X, padx=10)

        tk.Label(win, text="项目名:").pack(pady=5)
        project_entry = tk.Entry(win)
        project_entry.pack(fill=tk.X, padx=10)

        tk.Label(win, text="作者:").pack(pady=5)
        author_entry = tk.Entry(win)
        author_entry.pack(fill=tk.X, padx=10)

        tk.Button(win, text="创建", command=save_po).pack(pady=15)

def main():
    root = tk.Tk()
    RecipeDisplayApp(root)  # 创建应用实例
    root.mainloop()

if __name__ == "__main__":
    main()